package com.linkgie.galaxyframework.crypto;

import com.linkgie.galaxyframework.crypto.spi.CryptoServiceProvider;

/**
 * {@link CryptogramFactory} 密码数据报创建工厂；
 * <p>
 * 
 * 此类型被设计用于面向密码提供者 {@link CryptoServiceProvider} 实现密码算法服务；
 * 
 * @author liso
 *
 */
public interface CryptogramFactory {

	/**
	 * 创建哈希码；
	 * 
	 * @param algorithm 哈希算法；
	 * @param rawBytes  哈希算法计算得到的哈希摘要的字节数组；
	 * @return 哈希码对象；
	 */
	HashCode createHash(Algorithm algorithm, byte[] rawBytes);

	/**
	 * 创建私钥；
	 * 
	 * @param algorithm 非对称密码算法；
	 * @param rawBytes  非对称密码算法产生的私钥的字节数组；
	 * @return 私钥对象；
	 */
	PrivateKey createPrivateKey(Algorithm algorithm, byte[] rawBytes);

	/**
	 * 创建公钥；
	 * 
	 * @param algorithm 非对称密码算法；
	 * @param rawBytes  非对称密码算法产生的公钥的字节数组；
	 * @return 公钥对象；
	 */
	PublicKey createPublicKey(Algorithm algorithm, byte[] rawBytes);

	/**
	 * 创建非对称密钥对；
	 * 
	 * @param algorithm          非对称密码算法；
	 * @param rawPublicKeyBytes  非对称密码算法产生的公钥的字节数组；
	 * @param rawPrivateKeyBytes 非对称密码算法产生的私钥的字节数组；
	 * @return 非对称密钥对；
	 */
	CryptoKeypair createKeypair(Algorithm algorithm, byte[] rawPublicKeyBytes, byte[] rawPrivateKeyBytes);

	/**
	 * 创建签名；
	 * 
	 * @param algorithm 签名算法；
	 * @param rawSignatureBytes  签名算法产生的签名的字节数组；
	 * @return 签名对象；
	 */
	Signature createSignature(PublicKey publicKey, byte[] rawSignatureBytes);

	/**
	 * 创建对称密钥；
	 * 
	 * @param algorithm 对称密码算法；
	 * @param rawBytes  对称密码算法产生的对称密钥的字节数组；
	 * @return 对称密钥对象；
	 */
	SymmetricKey createSymmetricKey(Algorithm algorithm, byte[] rawBytes);

}